<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>递归深拷贝实现</title>
</head>
<body>
    <script>
        // function fn(data){
        //     fn(data);
        // }
        // fn('abc');

        //递归深拷贝函数封装
        function deepClone(data){
            //创建一个容器  
            let container;
            //获取类型
            let type = getDataType(data);// 
            ////判断 data 的类型
            if(type === 'Array'){
                container = [];
            }else if(type === 'Object'){
                container = {};
            }
            //为容器中添加数据 for..in
            for(let i in data){
                //获取键值的类型
                let type = getDataType(data[i]);
                if(type === 'Array' || type === 'Object'){
                    //递归调用
                    container[i] = deepClone(data[i]);
                }else{
                    //基本数据类型 或者 函数
                    container[i] = data[i];
                }
            }
            //返回容器
            return container;
        }

        //目标数据  
        const school = {
            name: '尚硅谷',
            pos: ['北京','上海','深圳','武汉'],
            founder: {
                name:'刚哥',
                age: 45
            },
            //方法
            improve: function(){
                console.log('提升自己');
            }
        };
        
        //调用函数
        let result = deepClone(school);

        result.pos[0] = 'beijing';

        console.log(school);
        console.log(result);


        //获取数据的类型
        function getDataType(data){
            return Object.prototype.toString.call(data).slice(8, -1);
        }

        // console.log(getDataType([]));
        // console.log(getDataType({}));

        // console.log(Object.prototype.toString.call(1));
        // console.log(Object.prototype.toString.call('abc'));
        // console.log(Object.prototype.toString.call([]));
        // console.log(Object.prototype.toString.call({}));
        // console.log(Object.prototype.toString.call(undefined));



    </script>
</body>
</html>